<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main API documentation</title>
<meta name="description" content="This is an example of a plugin (type=&#34;dynamic&#34;), they will be updated during the stated point in the mainloop.
If you need to make a panel that is …" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/ir-black.min.css" crossorigin>
<style>
:root {
--highlight-color: #202;
}
html {
scrollbar-face-color: #646464;
scrollbar-base-color: #646464;
scrollbar-3dlight-color: #646464;
scrollbar-highlight-color: #646464;
scrollbar-track-color: #000;
scrollbar-arrow-color: #000;
scrollbar-shadow-color: #646464;
scrollbar-dark-shadow-color: #646464;
}
::-webkit-scrollbar { width: 14px; height: 3px;}
::-webkit-scrollbar-button {
background-color: #000;
height: 3px;}
::-webkit-scrollbar-track {
background-color: #646464;}
::-webkit-scrollbar-track-piece { background-color: #000;}
::-webkit-scrollbar-thumb { height: 50px; background-color: #666; border-radius: 7px;}
::-webkit-scrollbar-corner { background-color: #646464;}
::-webkit-resizer { background-color: #666;}
.flex {
display: flex !important;
}
body {
line-height: 1.5em;
color: #fff;
background-color: #1e1e1e;
font: 14px/1.5 Helvetica, Arial, sans-serif;
margin: 0;
padding: 0;
}
#content {
padding: 20px;
}
#sidebar {
padding: 30px;
overflow: hidden;
}
#sidebar>*:last-child {
margin-bottom: 2cm;
}
.http-server-breadcrumbs {
font-size: 130%;
margin: 0 0 15px 0;
}
#footer {
font-size: .75em;
padding: 5px 30px;
border-top: 1px solid #fff;
text-align: right;
}
#footer p {
margin: 0 0 0 1em;
display: inline-block;
}
#footer p:last-child {
margin-right: 30px;
}
h1,
h2,
h3,
h4,
h5 {
font-weight: 300;
color: #fff;
}
h1 {
font-size: 2.5em;
line-height: 1.1em;
}
h2 {
font-size: 1.75em;
margin: 1em 0 .50em 0;
}
h3 {
font-size: 1.4em;
margin: 25px 0 10px 0;
}
h4 {
margin: 0;
font-size: 105%;
}
h1:target,
h2:target,
h3:target,
h4:target,
h5:target,
h6:target {
background: #1e1e1e;
padding: 0.2em 0;
}
a {
color: #8fd6fc;
text-decoration: none;
transition: color .3s ease-in-out;
}
a:hover {
color: #00a4fc;
}
.title code {
font-weight: bold;
}
h2[id^="header-"] {
margin-top: 2em;
}
.ident {
color: #f6fc85;
}
strong {
color: #8fd6fc;
}
pre code {
background: transparent;
font-size: .8em;
line-height: 1.4em;
}
code {
background: rgba(255, 255, 255, 0.1);
padding: 1px 4px;
overflow-wrap: break-word;
}
h1 code {
background: transparent
}
pre {
background: transparent;
border: 0;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
margin: 1em 0;
padding: 1ex;
}
#http-server-module-list {
display: flex;
flex-flow: column;
}
#http-server-module-list div {
display: flex;
}
#http-server-module-list dt {
min-width: 10%;
}
#http-server-module-list p {
margin-top: 0;
}
.toc ul,
#index {
list-style-type: none;
margin: 0;
padding: 0;
}
#index code {
background: transparent;
}
#index h3 {
border-bottom: 1px solid #ddd;
}
#index ul {
padding: 0;
}
#index h4 {
margin-top: .6em;
font-weight: bold;
}
/* Make TOC lists have 2+ columns when viewport is wide enough.
Assuming ~20-character identifiers and ~30% wide sidebar. */
@media (min-width: 200ex) {
#index .two-column {
column-count: 2
}
}
@media (min-width: 300ex) {
#index .two-column {
column-count: 3
}
}
dl {
margin-bottom: 2em;
}
dl dl:last-child {
margin-bottom: 4em;
}
dd {
margin: 0 0 1em 3em;
}
#header-classes+dl>dd {
margin-bottom: 3em;
}
dd dd {
margin-left: 2em;
}
dd p {
margin: 10px 0;
}
.name {
background: #000;
font-weight: bold;
font-size: .85em;
padding: 5px 10px;
display: inline-block;
min-width: 40%;
}
.name:hover {
background: #0b0b0b;
}
dt:target .name {
background: var(--highlight-color);
}
.name>span:first-child {
white-space: nowrap;
}
.name.class>span:nth-child(2) {
margin-left: .4em;
}
.inherited {
color: #999;
border-left: 5px solid #eee;
padding-left: 1em;
}
.inheritance em {
font-style: normal;
font-weight: bold;
}
.pydefname {
color: #f90;
}
/* Docstrings titles, e.g. in numpydoc format */
.desc h2 {
font-weight: 400;
font-size: 1.25em;
}
.desc h3 {
font-size: 1em;
}
.desc dt code {
background: inherit;
/* Don't grey-back parameters */
}
.source summary,
.git-link-div {
color: #666;
text-align: right;
font-weight: 400;
font-size: .8em;
text-transform: uppercase;
}
.source summary>* {
white-space: nowrap;
cursor: pointer;
}
.git-link {
color: inherit;
margin-left: 1em;
}
.source pre {
max-height: 500px;
overflow: auto;
margin: 0;
}
.source pre code {
font-size: 12px;
overflow: visible;
}
.hlist {
list-style: none;
}
.hlist li {
display: inline;
}
.hlist li:after {
content: ',\2002';
}
.hlist li:last-child:after {
content: none;
}
.hlist .hlist {
display: inline;
padding-left: 1em;
}
img {
max-width: 100%;
}
td {
padding: 0 .5em;
}
.admonition {
padding: .1em .5em;
margin-bottom: 1em;
}
.admonition-title {
font-weight: bold;
}
.admonition.note,
.admonition.info,
.admonition.important {
background: #00a;
}
.admonition.todo,
.admonition.versionadded,
.admonition.tip,
.admonition.hint {
background: #050;
}
.admonition.warning,
.admonition.versionchanged,
.admonition.deprecated {
background: #ec0;
}
.admonition.error,
.admonition.danger,
.admonition.caution {
background: #c20010;
}
p {
color: #fff;
}
</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main</code></h1>
</header>
<section id="section-intro">
<p>This is an example of a plugin (type="dynamic"), they will be updated during the stated point in the mainloop.
If you need to make a panel that is only updated when it's open then check the Panel example!</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;
This is an example of a plugin (type=&#34;dynamic&#34;), they will be updated during the stated point in the mainloop.
If you need to make a panel that is only updated when it&#39;s open then check the Panel example!
&#34;&#34;&#34;
from plugins.plugin import PluginInformation


PluginInfo = PluginInformation(
    name=&#34;UFLDLaneDetection&#34;, # This needs to match the folder name under plugins (this would mean plugins\Plugin\main.py)
    description=&#34;Most credit goes to jason-li-831202 for his\nVehicle-CV-ADAS repository.\nHe did most of the work, I just made it work in ETS2.&#34;,
    version=&#34;0.1&#34;,
    author=&#34;Tumppi066&#34;,
    url=&#34;https://github.com/jason-li-831202/Vehicle-CV-ADAS/tree/master&#34;,
    type=&#34;dynamic&#34;, # = Panel
    dynamicOrder=&#34;before lane detection&#34;, # Will run the plugin before anything else in the mainloop (data will be empty)
    exclusive=&#34;LaneDetection&#34;, # Will disable the other lane detection plugins
    noUI = True
)


from plugins.UFLDLaneDetection.UFLD.ultrafastLaneDetector.utils import LaneModelType
from plugins.UFLDLaneDetection.UFLD.ultrafastLaneDetector.ultrafastLaneDetectorV2 import UltrafastLaneDetectorV2
from src.logger import print

import tkinter as tk
from tkinter import ttk
import src.helpers as helpers
import src.mainUI as mainUI
import src.variables as variables
import src.settings as settings
import os

import cv2
import numpy as np

# This will temporarily add the NVIDIA CUDA libraries to the system path

nvidiaPath = &#34;src/NVIDIA&#34;
nvidiaPath = os.path.join(variables.PATH, nvidiaPath)

os.environ[&#34;PATH&#34;] = nvidiaPath

def ProcessFrame(data):
    image = data[&#34;frame&#34;]
    
    input_tensor = laneDetector.prepare_input(image)

    # Perform inference on the image
    output = laneDetector.infer.inference(input_tensor)

    # Process output data
    try:
        laneDetector.lanes_points, laneDetector.lanes_detected = laneDetector.process_output(output, laneDetector.cfg, original_image_width =  laneDetector.img_width, original_image_height = laneDetector.img_height)
    except:
        import traceback
        traceback.print_exc()
        
    return laneDetector.lanes_points, laneDetector.lanes_detected

# The main file runs the &#34;plugin&#34; function each time the plugin is called
# The data variable contains the data from the mainloop, plugins can freely add and modify data as needed
# The data from the last frame is contained under data[&#34;last&#34;]
laneDetector = None
def plugin(data):
    global laneDetector
    
    if laneDetector == None:
        try:
            laneDetector = UltrafastLaneDetectorV2(model_path, model_type)
        except:
            from tkinter import messagebox
            messagebox.showerror(&#34;ULFD&#34;, &#34;Could not load the model file. Most likely it&#39;s missing.\nUFLD will now disable itself.&#34;)
            settings.RemoveFromList(&#34;Plugins&#34;, &#34;Enabled&#34;, &#34;UFLDLaneDetection&#34;)
            variables.UpdatePlugins()
    
    try:
        lanePoints, lanesDetected = ProcessFrame(data)
        
        farLeftLane = lanePoints[0]
        leftLane = lanePoints[1]
        rightLane = lanePoints[2]
        farRightLane = lanePoints[3]
            
            
        
        data[&#34;LaneDetection&#34;] = {}
        data[&#34;LaneDetection&#34;][&#34;farLeftLane&#34;] = farLeftLane
        data[&#34;LaneDetection&#34;][&#34;leftLane&#34;] = leftLane
        data[&#34;LaneDetection&#34;][&#34;rightLane&#34;] = rightLane
        data[&#34;LaneDetection&#34;][&#34;farRightLane&#34;] = farRightLane
        data[&#34;LaneDetection&#34;][&#34;lanesDetected&#34;] = lanesDetected
        
        # Calculate difference between lanes
        leftLanePoints = leftLane[len(leftLane)-10:len(leftLane)]
        rightLanePoints = rightLane[len(rightLane)-10:len(rightLane)]
        leftLaneX = np.mean(leftLanePoints, axis=0)[0]
        rightLaneX = np.mean(rightLanePoints, axis=0)[0]
        
        frame = data[&#34;frame&#34;]
        
        w = frame.shape[1]
        h = frame.shape[0]
        
        difference = (rightLaneX - leftLaneX) / 2
        difference = difference + leftLaneX
        
        cv2.circle(frame, (int(leftLaneX), int(h/8*7)), 4, (0,255,0), -1, cv2.LINE_AA)
        cv2.circle(frame, (int(rightLaneX), int(h/8*7)), 4, (0,255,0), -1, cv2.LINE_AA)
        cv2.circle(frame, (int(difference), int(h/8*7)), 4, (0,0,255), -1, cv2.LINE_AA)
        data[&#34;frame&#34;] = frame
        
        difference = difference / w - 0.5 # Scale it between -1 and 1
        
        data[&#34;LaneDetection&#34;][&#34;difference&#34;] = difference 
        
    except Exception as ex:
        print(ex)

    return data # Plugins need to ALWAYS return the data


# Plugins need to all also have the onEnable and onDisable functions
def onEnable():
    
    global model_path, model_type
    
    path = variables.PATH
    if os.name == &#34;nt&#34;:
        model_path = os.path.join(path, r&#34;plugins\UFLDLaneDetection\UFLD\models\tusimple_res34.onnx&#34;)
    else:
        model_path = os.path.join(path, r&#34;plugins\UFLDLaneDetection\UFLD\models\tusimple_res34.onnx&#34;)
    print(&#34;Model path: &#34; + model_path)
    model_type = LaneModelType.UFLDV2_TUSIMPLE
    pass

def onDisable():
    pass

# Plugins can also have UIs, this works the same as the panel example
class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.exampleFunction()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        
        def exampleFunction(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=600, height=520, border=0, highlightthickness=0)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            # Helpers provides easy to use functions for creating consistent widgets!
            helpers.MakeLabel(self.root, &#34;This is a plugin!&#34;, 0,0, font=(&#34;Roboto&#34;, 20, &#34;bold&#34;), padx=30, pady=10, columnspan=2)
            # Use the mainUI.quit() function to quit the app
            helpers.MakeButton(self.root, &#34;Quit&#34;, lambda: mainUI.quit(), 1,0, padx=30, pady=10)
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        
        def update(self, data): # When the panel is open this function is called each frame 
            self.root.update()
    
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.ProcessFrame"><code class="name flex">
<span>def <span class="ident">ProcessFrame</span></span>(<span>data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def ProcessFrame(data):
    image = data[&#34;frame&#34;]
    
    input_tensor = laneDetector.prepare_input(image)

    # Perform inference on the image
    output = laneDetector.infer.inference(input_tensor)

    # Process output data
    try:
        laneDetector.lanes_points, laneDetector.lanes_detected = laneDetector.process_output(output, laneDetector.cfg, original_image_width =  laneDetector.img_width, original_image_height = laneDetector.img_height)
    except:
        import traceback
        traceback.print_exc()
        
    return laneDetector.lanes_points, laneDetector.lanes_detected</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.onDisable"><code class="name flex">
<span>def <span class="ident">onDisable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def onDisable():
    pass</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.onEnable"><code class="name flex">
<span>def <span class="ident">onEnable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def onEnable():
    
    global model_path, model_type
    
    path = variables.PATH
    if os.name == &#34;nt&#34;:
        model_path = os.path.join(path, r&#34;plugins\UFLDLaneDetection\UFLD\models\tusimple_res34.onnx&#34;)
    else:
        model_path = os.path.join(path, r&#34;plugins\UFLDLaneDetection\UFLD\models\tusimple_res34.onnx&#34;)
    print(&#34;Model path: &#34; + model_path)
    model_type = LaneModelType.UFLDV2_TUSIMPLE
    pass</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.plugin"><code class="name flex">
<span>def <span class="ident">plugin</span></span>(<span>data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def plugin(data):
    global laneDetector
    
    if laneDetector == None:
        try:
            laneDetector = UltrafastLaneDetectorV2(model_path, model_type)
        except:
            from tkinter import messagebox
            messagebox.showerror(&#34;ULFD&#34;, &#34;Could not load the model file. Most likely it&#39;s missing.\nUFLD will now disable itself.&#34;)
            settings.RemoveFromList(&#34;Plugins&#34;, &#34;Enabled&#34;, &#34;UFLDLaneDetection&#34;)
            variables.UpdatePlugins()
    
    try:
        lanePoints, lanesDetected = ProcessFrame(data)
        
        farLeftLane = lanePoints[0]
        leftLane = lanePoints[1]
        rightLane = lanePoints[2]
        farRightLane = lanePoints[3]
            
            
        
        data[&#34;LaneDetection&#34;] = {}
        data[&#34;LaneDetection&#34;][&#34;farLeftLane&#34;] = farLeftLane
        data[&#34;LaneDetection&#34;][&#34;leftLane&#34;] = leftLane
        data[&#34;LaneDetection&#34;][&#34;rightLane&#34;] = rightLane
        data[&#34;LaneDetection&#34;][&#34;farRightLane&#34;] = farRightLane
        data[&#34;LaneDetection&#34;][&#34;lanesDetected&#34;] = lanesDetected
        
        # Calculate difference between lanes
        leftLanePoints = leftLane[len(leftLane)-10:len(leftLane)]
        rightLanePoints = rightLane[len(rightLane)-10:len(rightLane)]
        leftLaneX = np.mean(leftLanePoints, axis=0)[0]
        rightLaneX = np.mean(rightLanePoints, axis=0)[0]
        
        frame = data[&#34;frame&#34;]
        
        w = frame.shape[1]
        h = frame.shape[0]
        
        difference = (rightLaneX - leftLaneX) / 2
        difference = difference + leftLaneX
        
        cv2.circle(frame, (int(leftLaneX), int(h/8*7)), 4, (0,255,0), -1, cv2.LINE_AA)
        cv2.circle(frame, (int(rightLaneX), int(h/8*7)), 4, (0,255,0), -1, cv2.LINE_AA)
        cv2.circle(frame, (int(difference), int(h/8*7)), 4, (0,0,255), -1, cv2.LINE_AA)
        data[&#34;frame&#34;] = frame
        
        difference = difference / w - 0.5 # Scale it between -1 and 1
        
        data[&#34;LaneDetection&#34;][&#34;difference&#34;] = difference 
        
    except Exception as ex:
        print(ex)

    return data # Plugins need to ALWAYS return the data</code></pre>
</details>
</dd>
</dl>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI"><code class="flex name class">
<span>class <span class="ident">UI</span></span>
<span>(</span><span>master)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.exampleFunction()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        
        def exampleFunction(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=600, height=520, border=0, highlightthickness=0)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            # Helpers provides easy to use functions for creating consistent widgets!
            helpers.MakeLabel(self.root, &#34;This is a plugin!&#34;, 0,0, font=(&#34;Roboto&#34;, 20, &#34;bold&#34;), padx=30, pady=10, columnspan=2)
            # Use the mainUI.quit() function to quit the app
            helpers.MakeButton(self.root, &#34;Quit&#34;, lambda: mainUI.quit(), 1,0, padx=30, pady=10)
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        
        def update(self, data): # When the panel is open this function is called each frame 
            self.root.update()
    
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
<h3>Methods</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.destroy"><code class="name flex">
<span>def <span class="ident">destroy</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def destroy(self):
    self.done = True
    self.root.destroy()
    del self</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.exampleFunction"><code class="name flex">
<span>def <span class="ident">exampleFunction</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def exampleFunction(self):
    
    try:
        self.root.destroy() # Load the UI each time this plugin is called
    except: pass
    
    self.root = tk.Canvas(self.master, width=600, height=520, border=0, highlightthickness=0)
    self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
    self.root.pack_propagate(0)
    
    # Helpers provides easy to use functions for creating consistent widgets!
    helpers.MakeLabel(self.root, &#34;This is a plugin!&#34;, 0,0, font=(&#34;Roboto&#34;, 20, &#34;bold&#34;), padx=30, pady=10, columnspan=2)
    # Use the mainUI.quit() function to quit the app
    helpers.MakeButton(self.root, &#34;Quit&#34;, lambda: mainUI.quit(), 1,0, padx=30, pady=10)
    
    self.root.pack(anchor=&#34;center&#34;, expand=False)
    self.root.update()</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.update"><code class="name flex">
<span>def <span class="ident">update</span></span>(<span>self, data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def update(self, data): # When the panel is open this function is called each frame 
    self.root.update()</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection" href="index.html">Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.ProcessFrame" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.ProcessFrame">ProcessFrame</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.onDisable" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.onDisable">onDisable</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.onEnable" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.onEnable">onEnable</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.plugin" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.plugin">plugin</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI">UI</a></code></h4>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.destroy" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.destroy">destroy</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.exampleFunction" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.exampleFunction">exampleFunction</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.update" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.UFLDLaneDetection.main.UI.update">update</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>